home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Aminet 31
/
Aminet 31 (1999)(Schatztruhe)[!][Jun 1999].iso
/
Aminet
/
docs
/
mags
/
saku28d2.lha
/
Teksti
/
Pelipuu.txt
< prev
next >
Wrap
Text File
|
1999-03-09
|
10KB
|
298 lines
2
1
2 Numeropeli.IFF 0 0
3 Pelipuu.IFF 0 0*
{3 Pelipuuta ilman muuta
{3 ---------------------
Petri Keckman
Nyt on hyvä peli! Älkää jättäkö sitä kokeilematta aikaisempien kokemustenne pe-
rusteella "peleistäni".
Yli kymmenen vuoden tauon jälkeen päätin ryhtyä käyttämään Pascal-ohjelmointi-
kieltä. Voi miksi olen yrittänytkään koskaan käyttää mitään muuta? Se on Amigal-
la helppoa ja halpaa PCQ-freeware-kääntäjällä - sen jälkeen kun systeemin saan-
nut asetettua ja sitä on oppinut käyttämään... tai no jaa, melkoista pilkunvii-
lausta se ohjelmointi aina on.
Pascal oli hallitseva opetuskieli yliopistomaailmassa 70- ja vielä pitkälti
80-luvulla. Pascalin syntaksissa kaikki muuttujat ja tyypit on esiteltävä lohko-
jen (ts. ohjelmien tai aliohjelmien) alussa, mikä aluksi saattaa tuntua hanka-
lalta mutta kuitenkin helpottaa ohjelmointia ja karsii huolimattomuusvirheitä,
kun ne eivät mene edes kääntäjästä läpi... tai niiden ei pitäisi; vaikuttaa
siltä, että esimerkiksi Integer- ja Real-tyyppisiä muuttujia saa PCQ:ssa käyttää
samoissa lausekkeissa, jolloin saattaa tulla virheitä, kun Real-luvun tallennus
tulkitaan Integeriksi.
Pascal suosii - ellei peräti vaadi - rakenteellista ohjelmointia, jossa ohjel-
moitava ongelma on jaettu selkeisiin aliohjelmiin. Se muistuttaa paljolti C-
kieltä. Kuten yleensäkin ohjelmointikielillä, silläkin voi tehdä tietysti vaikka
mitä. Eroja on lähinnä syntaksin pilkkusäännöissä.
Sillä on tullut suoritettua perus- ja aineopintojen labroja - suoritettua, mut-
tei palautettua. Olin niin kypsynyt yliopiston arvomaailmaan, jossa tärkeintä
oli kerätä suorituspisteitä kopioimalla laskuharjoituksia, että menin toiseen
äärimmäisyyteen: opiskelin omaksi huvikseni ja tiedokseni ja jätin merkkaamatta
laskuharjoitukset ja palauttamatta labrat. Helvettiäkö minun ohjelmointiharras-
tukseni muille kuului?
Ohjelmat-hakemistosta löytyvän numeropeli-ohjelman eräs versio tuli kuitenkin
aikoinaan palautettua "Tietorakenteet"-kurssiin kuuluvana harjoitustyönä, joskus
vuonna 1987, silloin kun vielä uskalsin kuvitella osaavani ohjelmoida. Siinä
harjoiteltiin pelipuun käsittelyä. Pelipuu on tietorakenne, johon rakennetaan
kustakin pelitilanteesta vaihtoehtoiset jatkotilanteet ja valitaan paras mahdol-
linen siirto. Pelilaudan tilannetta kuvaa arvofunktio, joka on pelipuun solmun
arvo. Koko pelilaudan tilannetta ei siis tallenneta solmun arvoksi, vaan vain
arvofunktion arvo. Pelipuuta rakennettaessa täytyy pelilaudan tilannekin olla
kuitenkin selvillä, jotta sitä päästään rakentamaan. Siksi pelipuun solmuun tal-
lennetaan myös tehdyn siirron sarake- tai rivi-indeksi.
Numeropelin idea on yksinkertainen: pelaajat nostavat vuorotellen numeroituja
laattoja, toinen rivittäin, siltä riviltä, jolta toinen (sarakkeittain pelaava)
oli poistanut laatan. Viimeksi poistetun laatan paikalle siirretään tähtilaatta.
Laattojen numerot lasketaan yhteen. Suuremman summan kerännyt on voittanut ti-
lanteessa, jossa vuorossa oleva ei pääse enää jatkamaan, kun laatat ovat loppu-
neet. Tähän peliin liittyvä pelitilannetta kuvaava arvofunktio, jonka pelipuual-
goritmi tarvitsee, on siis äärimmäisen yksinkertainen: kerättyjen laattojen sum-
masta vähennetään vastustajan keräämien laattojen summa.
{D ---------->
{1 Algoritmi on ajanut pelaajan tuka-
{1 laan asemaan ja johtaa 40-27. Pe-
{1 laajalla nostettavina laatat -11,
{1 -12 tai -11.
{1 ---------->
{1 Pelipuun yksi haara kolme siir-
{1 toa eteenpäin. Algoritmissa tal-
{1 lennusmuoto on pinotetut jonot.
{1 ---------->
Alkuperäinen versio kaukaisilta opiskeluajoiltani tulosti merkkigrafiikkaa
käskyrivi-ikkunaan, josta alla huvin vuoksi esimerkkiajon alkua ja loppua. Kone
aloitti poistamalla täydeltä pelilaudalta laatan riviltä 3 sarakkeelta 2.
8.H1:OHJELMOINTI/pcq12d> omat/numeropeli
*************************************************************
* JOS HALUAT MUUTTAA JONKIN ALLAOLEVAN ASETUKSEN ARVOA, *
* NIIN SYOTA VASTAAVA NUMERO 1..7. *
*************************************************************
1. KONE ALOITTAA.
2. KONE PELAA SARAKKEITTAIN.
3. OHJELMA ARPOO LAATOILLE PAIKAT JA ARVOT
4. LAATTOJEN PIENIN ARVO = -8
5. LAATTOJEN MAKSIMI ARVO = 8
6. OHJELMA TUTKII 6 SIIRTOA ETEENPAIN.
7. KONE PELAA KAYTTAJAA VASTAAN.
JOS HALUAT MUUTTAA PELIKENTAN KOKOA 4x4,
NIIN MUUTA OHJELMASTA VAKION maxind ARVOA.
*************************************************************
* SYOTA 8 KUN HALUAT LOPETTAA KOKO OHJELMAN TAI *
* SYOTA 0 KUN OLET VALMIS PELAAMAAN. *
*************************************************************
0. ALETAAN PELAAMAAN.
8. LOPETETAAN PELAAMINEN.
SYOTA LUKU 0..8 ?
0
SARAKE=1 2 3 4
RIVI ::::::::::::::::: PELITILANNE:
1 : 1: -1: 7: 4: KONE =0
::::::::::::::::: PELAAJA=0
2 : -1: -8: -5: 1:
:::::::::::::::::
3 : 0: 7: 6: -7:
:::::::::::::::::
4 : -8: -1: 0: 4:
:::::::::::::::::
SARAKE=1 2 3 4
RIVI ::::::::::::::::: PELITILANNE:
1 : 1: -1: 7: 4: KONE =7
::::::::::::::::: PELAAJA=0
2 : -1: -8: -5: 1:
:::::::::::::::::
3 : 0: * : 6: -7:
:::::::::::::::::
4 : -8: -1: 0: 4:
:::::::::::::::::
SYOTA POISTETTAVAN LAATAN SARAKEINDEKSI VALILTA 1..4:
3
SARAKE=1 2 3 4
RIVI ::::::::::::::::: PELITILANNE:
1 : 1: -1: 7: 4: KONE =7
::::::::::::::::: PELAAJA=6
2 : -1: -8: -5: 1:
:::::::::::::::::
3 : 0: : * : -7:
:::::::::::::::::
4 : -8: -1: 0: 4:
:::::::::::::::::
SARAKE=1 2 3 4
RIVI ::::::::::::::::: PELITILANNE:
1 : 1: -1: * : 4: KONE =14
::::::::::::::::: PELAAJA=6
2 : -1: -8: -5: 1:
:::::::::::::::::
3 : 0: : : -7:
:::::::::::::::::
4 : -8: -1: 0: 4:
:::::::::::::::::
SYOTA POISTETTAVAN LAATAN SARAKEINDEKSI VALILTA 1..4:
4
..jne. jne...
SARAKE=1 2 3 4
RIVI ::::::::::::::::: PELITILANNE:
1 : 1: -1: : : KONE =13
::::::::::::::::: PELAAJA=-14
2 : : : : :
:::::::::::::::::
3 : : : : :
:::::::::::::::::
4 : * : : : :
:::::::::::::::::
SARAKE=1 2 3 4
RIVI ::::::::::::::::: PELITILANNE:
1 : * : -1: : : KONE =14
::::::::::::::::: PELAAJA=-14
2 : : : : :
:::::::::::::::::
3 : : : : :
:::::::::::::::::
4 : : : : :
:::::::::::::::::
SYOTA POISTETTAVAN LAATAN SARAKEINDEKSI VALILTA 1..4:
2
SARAKE=1 2 3 4
RIVI ::::::::::::::::: PELITILANNE:
1 : : * : : : KONE =14
::::::::::::::::: PELAAJA=-15
2 : : : : :
:::::::::::::::::
3 : : : : :
:::::::::::::::::
4 : : : : :
:::::::::::::::::
KONE EI VOI TEHDA ENAA SIIRTOA.
HAVISIT TALLA KERTAA.
Vaikka peli on yksinkertainen - tai juuri sen takia - on se ihmiselle kuitenkin
sen verran vaikeaa, etten ole Amigaani kertaakaan voittanut vähänkään isommilla
vaikeustasoilla. Tosin en jaksakaan yleensä miettiä kuin korkeintaan kaksi siir-
toa eteenpäin - yleensä näpäytän hiirellä sitä rivin suurinta laattaa.
Kuinka kone sitten tarkemmin ottaen tekee siirtonsa? Samalla tavalla kuin ihmi-
nen yrittää miettiä: jos nostan tuon laatan, niin se nostaa tuon laatan, jolloin
minun on nostettava jokin noista, jolloin kone pääsee kuitenkin nostamaan tuon
laa